/*
 *  Methods.h
 *  NiNJA
 *
 *  Created by waver on 09-11-12.
 *  Copyright 2009 __MyCompanyName__. All rights reserved.
 *
 */
#import <vector>
#import <iostream>
#import "VariableDefine.h"
#import "TypeRedefine.h"
#import <list>
#import <sstream>
#import <string>

using namespace std; 


const double RADIANS_CON = 3.1415927;		//π


class PubMethod {

public:
	/*!
    @function	powi
    @abstract   计算一个数的N次
    @discussion  计算一个数的多少次冥
    @param      v:要计算的基数,K:要计算的冥的次数
    @result     返回计算结果
*/static double powi(double v, int k);
	
	
	
	
	/*!
    @function	fac
    @abstract   计算一个整数的阶乘
    @discussion  
    @param      m:需要计算的整数
    @result     计算结果
*/static long fac(int m);
	
	
	/*!
    @function	unsignInt
    @abstract   去一个int值的绝对值
    @discussion 
    @param      
    @result     
*/static  int unsignInt(int a);
	
/*!
    @function	IsInArea
    @abstract   检测是否在范围内
    @discussion 检测两个坐标的X方向的距离是否在提供的范围内
    @param      x_limit:提供的检测范围
    @result     true:在范围内;false:不在范围内
*/static bool	 IsInArea(CoordinateValue one_co,CoordinateValue two_co,int x_limit);
	
	
/*!
    @function	LongInArea
    @abstract   检测两个数的差值
    @discussion 检测两个数的差的绝对值是否在一个范围内
    @param      
    @result     true:在范围内
*/static bool  LongInArea(int one_point,int two_point,int num_limit);
	
	
/*!
    @function		Aleart
    @abstract   警告
    @discussion 在控制台输出需要的警告信息
    @param      字符串
    @result     
*/static void  Aleart(const char * message_dis);
	
	
	
/*!
    @function	RemoveIntVectorItem
    @abstract   去除vector<int>中的值
    @discussion 
    @param      
    @result     
*/static void RemoveIntVectorItem(vector<int> &select_index,int remove_item);

	
	
/*!
    @function	IsIntInVector
    @abstract   判断一个数字是不是在vector中
    @discussion 
    @param      
    @result     如果在返回true,如果不在返回false
*/static bool IsIntInVector(vector<int> select_index,int item);
	
	

	
	

	
	
	
/*!
    @function	NewRand
    @abstract   生成随机数
    @discussion 此生成随机数的函数是与系统时间和time_add相关,可用于同一时间内多次求随机数相同的问题
    @param      time_add:当前时间加值,max_n_set:生成随机数的最大值
    @result     0~max_n_set
 */static int	NewRand(int time_add, int max_n_set);
	
	
	
/*!
    @function	CheckPointInRectangle
    @abstract   矩形
    @discussion  判断一个点是不是在一个矩形范围内
    @param      point_check:需要判断的点坐标; left_up_point:矩形的左上坐标; right_down_point:矩形的右下坐标
    @result     在矩形内返回:true,否则返回:false
*/static bool CheckPointInRectangle(CoordinateValue point_check, CoordinateValue left_up_point,CoordinateValue right_down_point);

	
	
/*!
    @function
    @abstract   获得一个整数的位数
    @discussion 返回一个数有多少位
    @param      输入一个整数
    @result     
*/static int GetNumberBit(int num);
	
	
/*!
    @function
    @abstract    获得指定位数上的数字
    @discussion  返回一个整数上的指定位上的数字
    @param      num:制定的整数,bit_point:输入指定的数位 
    @result     
 */static int GetBitNumber(int num,int bit_point);


/*!
    @function
    @abstract   转换角度到弧度
    @discussion 获取一个角度转换成弧度的大小,180用3.1415927表示
    @param      
    @result     返回弧度值
*/static double CalculateAgleToRadian(int angle);
	
	
/*!
    @function
    @abstract   将int转成C++STRING
    @discussion 将一个int整型转换成string类型
    @param      整数
    @result     string类型
*/static string IntToString(int num);
	
/*!
    @method     
    @abstract   返回两座标点的角度,第一个点指向第二个点
    @discussion 此方法用于横屏,x坐标轴向右,Y坐标轴向下
*/	static float TwoPointAngle(float x1,float y1,float x2,float y2);
	
	static int NewPosition(int playerOrd, int ord);
	
};

//用来删除具有指针动态内存的list链表
template<typename T>
void	DeleteListPointer(list<T>& tempList)
{
	typename list<T>::iterator list_first;
	list_first =  tempList.begin();
	
	for(list_first; list_first!= tempList.end();list_first++)
	{
		delete *list_first;
		
		*list_first = NULL;
	}
	
	tempList.clear();
}

template<typename T1,typename T2>
void	AddMapToMap(map<T1,T2> & result_map,map<T1,T2>& add_map)
{
	typename map<T1,T2>::iterator map_first;
	map_first = add_map.begin();
	
	for(map_first;map_first!= add_map.end();map_first++)
	{
		result_map.insert(pair<T1,T2>(map_first->first,map_first->second));
	}
}

//检索一个list链表里是否存有四个一样的元素,返回第一个元素的索引,0为没有,1为第一个元素
template<typename T1>
vector<int>	ListHaveFourSame(list<T1> & listElement)
{
	typename list<T1>::iterator list_it_first;
	typename list<T1>::iterator list_it_com;
	listElement.sort();
	
	list_it_first = listElement.begin();
	
	int a = 0;
	vector<int> FourVec;
	FourVec.clear();
	
	if(listElement.size() < 4)
	{
		return FourVec;
	}
	
	while (true) 
	{
		list_it_com = list_it_first;
		advance(list_it_com, 3);
		if(list_it_com == listElement.end())
		{
			break;
		}
		if(*list_it_com == *list_it_first)
		{
			FourVec.push_back(a);
			a = a + 4;
			advance(list_it_first, 4);
			
			if(list_it_first == listElement.end())
			{
				break;
			}
		}
		else
		{
			a++;
			list_it_first++;
			if(list_it_first == listElement.end())
			{
				break;
			}
			continue;
		}
	}
	return FourVec;
}


